/* SPDX-License-Identifier: GPL-2.0-only */

Name(\CBA1, 0x60)
Name(\CBA2, 0x60)

Device (BAT1)
{
	Name(_HID, EisaId("PNP0C0A"))
	Name(_UID, 1)

	Name(_PCL, Package(){ _SB })
	Name(PSTA, 0x1f)
	Name(PBIF, Package() {
		0x00,
		0x78,
		0x64,
		0x01,
		0x2b5c,	// Capacity?
		0x05,
		0x03,
		0x01,
		0x01,
		"???",	// Name
		"???",	// Number
		"???",	// Type
		"???"	// Vendor
	})
	Name(PBST, Package() { 0x01, 0x16, 0x64, 0x2b5c })

	/* Status */
	Method(_STA, 0)
	{
		If(\_SB.PCI0.LPCB.EC0.ECON) {
			If(\_SB.PCI0.LPCB.EC0.P62S) {
				Return(0x0f)
			} Else {
				Return(0x1f)
			}
		} Else {
			Return(0x0f)
		}
	}

	/* Battery Info */
	Method(_BIF, 0)
	{
		If(\_SB.PCI0.LPCB.EC0.ECON) {
			If(\_SB.PCI0.LPCB.EC0.P62S) {
				IVBI()
				IVBS()
			} Else {
				UPBI()
			}
		}

		Return(PBIF)
	}

	/* Battery Status */
	Method(_BST, 0)
	{
		If(\_SB.PCI0.LPCB.EC0.ECON) {
			UPBS()
		}

		Return(PBST)
	}

	/* Update Battery Info */
	Method(UPBI, 0)
	{
		Store (0x78, Index(PBIF, 1))
		Store (0x64, Index(PBIF, 2))
		Store (0x2b5c, Index(PBIF, 4))
		Store ("Bat1", Index(PBIF, 9))
		Store ("001", Index(PBIF, 10))
		Store ("LION", Index(PBIF, 11))
		Store ("Panasonic", Index(PBIF, 12))
	}

	Method(UPBS, 0)
	{
		Store(\_SB.PCI0.LPCB.EC0.QEVT, Local0)
		If (Not(Local0)) {
			Store(0, GP38)
			Sleep(0x64)
			Store(GP38, Local0)
			If (Not(Local0)) {
				Store (RDW(0x0d), Local0)
				If (LNotEqual(Local0, 0xeeee)) {
					If (LLessEqual(Local0, 0x64)) {
						Store(Local0, CBA1)
					}
				}
			}
		}

		Store (CBA1, Local0)
		Store (Local0, Index(PBST, 2))
		Store (DerefOf(Index(PBIF, 4)), Index(PBST, 3))
		Store (0, Local1)

		If (PWRS) {
			If (LLess(Local0, 0x64)) {
				Store (2, Local1)
			}
		} Else {
			If (LLessEqual(Local0, 0x5)) {
				Store (4, Local1)
			} Else {
				Store (1, Local1)
			}
		}

		Store (Local1, Index(PBST, 0))
		If (\_SB.PCI0.LPCB.EC0.P63S) {
			Store (0x16, Index(PBST, 1))
		} Else  {
			Store (0x0b, Index(PBST, 1))
		}
	}

	// Invalidate Battery Info
	Method(IVBI, 0)
	{
		Store (0xffffffff, Index(PBIF, 1))
		Store (0xffffffff, Index(PBIF, 2))
		Store (0xffffffff, Index(PBIF, 4))
		Store ("Bad", Index(PBIF, 9))
		Store ("Bad", Index(PBIF, 10))
		Store ("Bad", Index(PBIF, 11))
		Store ("Bad", Index(PBIF, 12))
		Store (1, Index(PBIF, 0))
	}

	Method(IVBS, 0)
	{
		Store (0x0, Index(PBST, 0))
		Store (0xffffffff, Index(PBST, 1))
		Store (0xffffffff, Index(PBST, 2))
		Store (0xffffffff, Index(PBST, 3))
	}
}


Device (BAT2)
{
	Name(_HID, EisaId("PNP0C0A"))
	Name(_UID, 2)

	Name(_PCL, Package(){ _SB })
	Name(PSTA, 0x1f)
	Name(PBIF, Package() {
		0x00,
		0x78,
		0x64,
		0x01,
		0x2b5c,	// Capacity?
		0x05,
		0x03,
		0x01,
		0x01,
		"???",	// Name
		"???",	// Number
		"???",	// Type
		"???"	// Vendor
	})
	Name(PBST, Package() { 0x01, 0x16, 0x64, 0x2b5c })

	/* Status */
	Method(_STA, 0)
	{
		If(\_SB.PCI0.LPCB.EC0.ECON) {
			If(\_SB.PCI0.LPCB.EC0.P63S) {
				Return(0x0f)
			} Else {
				Return(0x1f)
			}
		} Else {
			Return(0x0f)
		}
	}

	/* Battery Info */
	Method(_BIF, 0)
	{
		If(\_SB.PCI0.LPCB.EC0.ECON) {
			If(\_SB.PCI0.LPCB.EC0.P63S) {
				IVBI()
				IVBS()
			} Else {
				UPBI()
			}
		}

		Return(PBIF)
	}

	/* Battery Status */
	Method(_BST, 0)
	{
		If(\_SB.PCI0.LPCB.EC0.ECON) {
			UPBS()
		}

		Return(PBST)
	}

	/* Update Battery Info */
	Method(UPBI, 0)
	{
		Store (0x78, Index(PBIF, 1))
		Store (0x64, Index(PBIF, 2))
		Store (0x2b5c, Index(PBIF, 4))
		Store ("Bat2", Index(PBIF, 9))
		Store ("002", Index(PBIF, 10))
		Store ("LION", Index(PBIF, 11))
		Store ("Panasonic", Index(PBIF, 12))
	}

	Method(UPBS, 0)
	{
		Store(\_SB.PCI0.LPCB.EC0.QEVT, Local0)
		If (Not(Local0)) {
			Store(0, GP38)
			Sleep(0x64)
			Store(GP38, Local0)
			If (Not(Local0)) {
				Store (RDW(0x0d), Local0)
				If (LNotEqual(Local0, 0xeeee)) {
					If (LLessEqual(Local0, 0x64)) {
						Store(Local0, CBA2)
					}
				}
			}
		}

		Store (CBA2, Local0)
		Store (Local0, Index(PBST, 2))
		Store (DerefOf(Index(PBIF, 4)), Index(PBST, 3))
		Store (0, Local1)

		If (PWRS) {
			If (LLess(Local0, 0x64)) {
				Store (2, Local1)
			}
		} Else {
			If (LLessEqual(Local0, 0x5)) {
				Store (4, Local1)
			} Else {
				Store (1, Local1)
			}
		}

		Store (Local1, Index(PBST, 0))
		If (\_SB.PCI0.LPCB.EC0.P62S) {
			Store (0x16, Index(PBST, 1))
		} Else  {
			Store (0x0b, Index(PBST, 1))
		}
	}

	// Invalidate Battery Info
	Method(IVBI, 0)
	{
		Store (0xffffffff, Index(PBIF, 1))
		Store (0xffffffff, Index(PBIF, 2))
		Store (0xffffffff, Index(PBIF, 4))
		Store ("Bad", Index(PBIF, 9))
		Store ("Bad", Index(PBIF, 10))
		Store ("Bad", Index(PBIF, 11))
		Store ("Bad", Index(PBIF, 12))
		Store (1, Index(PBIF, 0))
	}

	Method(IVBS, 0)
	{
		Store (0x0, Index(PBST, 0))
		Store (0xffffffff, Index(PBST, 1))
		Store (0xffffffff, Index(PBST, 2))
		Store (0xffffffff, Index(PBST, 3))
	}
}

Method (RDW, 1)
{
	Store (0x16, \_SB.PCI0.LPCB.EC0.SMAD)
	Store (Arg0, \_SB.PCI0.LPCB.EC0.SMCM)
	Store (0x09, \_SB.PCI0.LPCB.EC0.SMPR)
	While (LNotEqual(\_SB.PCI0.LPCB.EC0.SMPR, 0x00)) {
		Stall (1)
	}

	Return (\_SB.PCI0.LPCB.EC0.SMW0)
}

Device (ADP1)
{
	Name (_HID, "ACPI0003")
	Method (_PSR, 0)
	{
		If (\_SB.PCI0.LPCB.EC0.ECON) {
			Store (\_SB.PCI0.LPCB.EC0.P60S, Local0)
			If (Local0) {
				Store (0, PWRS)
			} Else {
				Store (1, PWRS)
			}
		}

		Stall (0x02)
		Return (PWRS)
	}

	Method (_PCL, 0)
	{
		Return (_SB)
	}
}
